Barracuda WAFのAutoScalingを試してみた
はじめに
こんにちは。
くコ:彡がトレードマークの阿部です。
Barracuda WAF(Web Application Firewall)は、AWS上でバーチャルアプライアンス型のWAFとして利用出来ます。
EC2インスタンスとして動作するため、ユーザーの自由が効きますが、冗長化やスケーリングは考慮する必要があります。
Barracuda社では、AutoScalingに対応したCloudFormationテンプレートを公開しています。
ユーザーの負担を減らす素晴らしいアイディアですね。
実際に試してみましたので、ご紹介します。
概要
CloudFormationで作成される環境を確認しましょう。
WAFインスタンスはELB配下に配置されます。AutoScaligを利用し負荷に応じてインスタンスが増減します。
負荷が少ない場合、インスタンスは減少し、負荷が高くなると、インスタンスは増加します。
事前準備
Barracuda社のテンプレートで環境を作る際に、ELBの名前や保護対象のDNS名を入力する必要があります。
そのため、事前にVPC、ELB、WebServerインスタンスを作成しておきます。
すぐに試せるように、CloudFormationテンプレート(webserver-template.template)を作成しておきました。
以降の説明はwebserver-template.templateの利用を前提にすすめます。
パラメーターを以下のように入力すると、VPC,ELB,EC2がプロビジョニングされます。
検証ではAmazon Linuxを指定しhttpdをインストールの上、index.htmlを配置しました。
- webserver-template.templateのパラメーター
EC2KeyName | WebServerのキーペア |
WebServerImageId | WebServerのAMI ID |
MaintenanceIP | WebServerにSSH出来る接続元IPアドレス(xx.xx.xx.xx/xxの形式で指定) |
CloudFormationテンプレートからのデプロイ
手順は、Importing the Barracuda Web Application Firewall CloudFormation Template and Deploying the Instanceにて公開されています。
詳しい手順はリンク先に任せるとして、ポイントをご紹介します。
aws marketplaceからの起動
aws marketplaceにアクセスし、[Barracuda Web Application Firewall]を選択します。
TokyoリージョンとDelivery Methods[Barracuda Web Application Firewall]を選択し、Continueを選択します。
初回は[Accept Sosfware Terms]の選択が必要です。
[Custom Launch]を選択し、以下のように入力します。
項目 | 入力値 |
Select a Version | 最新のバージョン |
Select a Region | Asia Pacific(Tokyo) |
Deployment Options | Deployment Options |
Software Pricing | Hourly |
入力後、[Launch with CloudFormation Console]を選択します。
Stackの作成画面に移ります。
パラメーターに以下のように入力し、Stack(=CloudFormationで管理される環境)を作成しました。
Parameter | 入力内容 | 備考 |
[Specify Details] | ||
Stack name | AWSMPBarracudaWebApplicationFirewall | スタック名の指定。デフォルト値で問題ありません |
[Networking Configuration] | ||
Availability Zone(s) | ap-northeast1a、ap-northeast-1c | WAFをデプロイするAZ |
Subnet Id(s) | WAF1a、WAF1c | WAFをデプロイするサブネット |
Elastic Load Balancer | ELBWAF | WAFクラスターにトラフィックを分配するELBの名前 |
Auto scaling Configuration | ||
Instance Type | m3.medium | WAFのインスタンスタイプ |
Minimum Instances | 1 | 最小のWAF数 (AutoScalingの最小インスタンス数) |
Maximum Instances | 4 | 最大のWAF数 (AutoScalingの最大インスタンス数) |
Notification Email | Eメールアドレス | SNSにセットされ、通知に利用されます |
[Barracuda Web Application Firewall Bootstrapping Configuration] | ||
Service Name | WebServer | WAF内で使われる任意のサービス名 |
Service Port | 80 | WAFが受け付けるサービス用のポート |
Server IP/FQDN | internal-ELBWebServer-XXXXXXXXX.ap-northeast-1.elb.amazonaws.com | 保護対象(WebServerにトラフィックを分配するInternal ELBの名前) |
Server Port | 80 | WAFがInternal ELBに分配するポート |
Minimum Instancesは"1"を選択しましょう。
2つのインスタンスが同時に起動した場合に、クラスタリングが動作しない場合があります。
この問題は修正される予定のようです。
※ Auto Scaling of Barracuda Web Application Firewall using CloudFormation Template on Amazon Web Services - Number of Instances
SNS受信登録の確認
指定したメールアドレス宛に件名:「AWS Notification - Subscription Confirmation」のメールが送信されます。
Confirm subscription
を選択すると、有効化されます。
デプロイ結果
CloudFormation画面にて、スタックのStatusがCREATE_COMPLETE
になれば、成功です。
EC2インスタンスとして、WAFが作成されます。
セキュリティグループの変更(WAF)
WAFインスタンス用のルールを変更します。
WAFインスタンスのセキュリティグループは、AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXX
として作成されます。
デフォルトのルールでは、全ての送信元が0.0.0.0/0に指定されています。
今回は以下のように変更しました。
- AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXXのルール
タイプ | プロトコル | ポート範囲 | 送信元 | 役割 |
HTTP | TCP | 80 | 0.0.0.0/0 | WEBサーバサービスポート |
カスタム TCP ルール | TCP | 8000 | 拠点IPアドレス | Barracuda WAF管理用 |
カスタム TCP ルール | TCP | 8002 | AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXX | クラスタリング |
カスタム TCP ルール | UTP | 32576 | AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXX | クラスタリング |
カスタム UDP ルール | UDP | 32575 | AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXX | クラスタリング |
セキュリティグループの変更(SgWebELB)
WebServerにトラフィックを分配する[ELBWebServer]に割り当てられたセキュリティグループ(SgWebELB)のルールを変更します。
WAFインスタンスからの80番アクセスを許可しましょう。
送信元にWAFインスタンスに割り当てられたセキュリティグループを指定します。
本変更により、WAFを経由しないHTTPアクセスは遮断されます。
- SgWebELBのルール
タイプ | プロトコル | ポート範囲 | 送信元 |
HTTP | TCP | 80 | AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXX |
WAFインスタンスの確認
http://WAFのPublicIP:8000/
で管理画面に接続し、「ユーザ名:admin、パスワード:インスタンスID」でログインします。
[サービス]を確認すると、パラメーターに入力した内容が反映されています。
保護対象のELBのIPアドレスが変わったり、スケールした時の挙動は未検証です。
WEBブラウザからの接続
WAFにトラフィックを分配するELB(ELBWAF)にアクセスしてみます。
http://elbwaf-XXXXXX.ap-northeast-1.elb.amazonaws.com/
に接続すると、Webサーバーに接続出来るはずです。
AutoScaling詳細
CloudFormationで構築されたAutoScalingに関連する内容を整理しましょう。
Auto Scaling グループ
スタック作成時のパラメーター値が反映されています。
最大数などを変更する場合、本内容を変更する事になります。
メールアドレスはSNSに登録され、インスタンスの[起動],[終了],[起動失敗],[終了失敗]の通知に利用されます。
- AutoScalingグループの主な設定項目
ロードバランサー | ELBWAF |
最小 | 1 |
最大 | 4 |
アベイラビリティーゾーン | ap-northeast-1c, ap-northeast-1a |
サブネット | WAF1a、WAF1c |
通知の送信先 | AWSMPBarracudaWebApplicationFirewall-NotificationTopic-XXXX (XX.XXX@XXXXXX.XX) |
起動設定(Launch Config)
Launch Configもスタック作成時のパラメーター値が反映されている事がわかります。
また、s3にアクセスするためにIAMプロファイルが設定されています。
- Launch Configの主な設定項目
AMI | ami-5eddc530 |
IAM インスタンスプロファイル
|
AWSMPBarracudaWebApplicationFirewall-BWAFAutoScalingInstanceProfile-XXXXX |
インスタンスタイプ
|
m3.medium |
s3
s3バケットawsmpbarracudawebapplicationfirewall-s3bucket-XXXXXXXXX
が作成されていました。
バケットには、WAFインスタンスのIPアドレス、シリアルナンバーを記載したファイルが格納されます。
スケールアウトが発生すると、新しいWAFインスタンスはバケットに接続し既存インスタンスの設定に同期します。
スケールインした場合にはファイルは削除されます。
バケットにファイルが見つからない場合、CloudFormationのパラメーターの内容に同期します。
スケールイン、スケールアウト
CloudWatch画面を確認してみます。
「AWSMPBarracudaWebApplicationFirewall」から始まるアラームが6つ作成されていました。
NetworkIn,NetworkOut,CPUUtilizationの結果を元に、スケールイン、スケールアウトするようになっています。
スケールアウト
スケールアウトした時の挙動を確認しましょう。
今回は負荷に応じた自動スケーリングではなく、手動でスケールアウトさせてみました。
手動スケールアウト
手動でスケールアウトしたインスタンスが削除されては、面倒です。
スケールインアクションを削除しておきます。
CloudWatch画面から、アラームを選択し開きます。アクション中の[削除]を選択します。
設定ステータスが[アクションなし]になれば、OKです。
WAFインスタンスを4台にスケールアウトしましょう。
AutoScalig Groupの[希望]を4にします。
ELBへの組み込み
WAFインスタンスが起動し、自動的にELB配下に組み込まれます。
HAへの組み込み
WAFのコンソール画面を確認してみます。。。
[HA(高可用性)]に組み込まれている事がわかります!
スケールアウトした場合でも設定が同期されるため、ユーザー側の操作は不要になります。
参考
- 新入社員のためのWAF(Web Application Firewall)入門
- Auto Scaling of Barracuda Web Application Firewall using CloudFormation Template on Amazon Web Services
おわりに
Barracuda社が公開しているCloudFormationを使ってWAFのAutoScaling構成を試してみました。
CloudFormationテンプレートを使う事で、一見複雑に思えるAutoScalingとHA構成をすぐに試す事が出来ました。
AWSでのセキュリティ対策には、AWSとの親和性が高い製品や技術を導入する事が重要だと思います。
では、また。